package QuestionDaily;

import java.util.HashMap;

public class entityParser_1410 {

    /**
     *实现一个 HTML 实体解析器，返回解析器解析后的结果。
     * @param text
     */
    public String entityParser(String text) {
        /**
         * 思路就是使用一个二维数组来存储所有特殊字符，再用一个一维数组对应位置的实体字符
         * 顺序添加字符
         * 18ms
         */
        char [][]arr={
                {'q','u','o','t',';'},
                {'a','p','o','s',';'},
                {'a','m','p',';'},
                {'g','t',';'},
                {'l','t',';'},
                {'f','r','a','s','l',';'}
        };
        char [] ar={'"','\'','&','>','<','/'};  //对应arr元素下标的字符
        StringBuilder temp=new StringBuilder();
        for(int i=0;i<text.length();){
            boolean flag=false;  //默认不可以匹配
            if(i<text.length()-3 && text.charAt(i)=='&'){  //当剩下元素数量已经不够一个特殊字符时，不再进行匹配
                for(int t=0;t<6;t++){
                    if(arr[t][0]==text.charAt(i+1)) {  //找到可能对应的字符
                        if(arr[t][0]=='a'){  //如果该字符是a需要额外判断，因为有两个以a开头的字符
                            if( isMatch(arr[t],text,i+1)){  //apos;
                                temp.append(ar[t]); //添加实体字符
                                i += arr[t].length+1; //绕过特殊字符
                                flag=true; //标记为匹配
                                break;  //找到任何一个符合的都可以直接退出循环
                            }else if(isMatch(arr[t+1],text,i+1)){  //amp;
                                temp.append(ar[t+1]);
                                i += arr[t+1].length+1;
                                flag=true;
                                break;  //找到任何一个符合的都可以直接退出循环
                            }
                            t++;    //因为两个a是相邻的，等于一次处理了两个，t额外加一
                        } else if (isMatch(arr[t], text, i + 1)) {
                            temp.append(ar[t]);
                            flag=true;
                            i += arr[t].length+1;
                            break;
                        }
                    }
                }
            }
            if(!flag){ //上边不匹配特殊字符时，一个一个添加
                temp.append(text.charAt(i));
                i++;
            }
        }
        return temp.toString();
    }

    /**
     * 判断text从i开始之后的字符是否匹配arr
     */
    boolean isMatch( char[]arr,String text,int i){
        int index=0;
        for(int t=i;t<i+arr.length;t++){
            if(text.charAt(t)!=arr[index++])
                return false;
        }
        return true;
    }
}

